/*
 * SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

use rand::rngs::StdRng;
use rand::{RngCore, SeedableRng};
use std::fs::{metadata, File};
use std::io::Write;
use std::process::Command;
use tempfile::tempdir;

#[test]
fn test_utzipsplit() {
    let dir = tempdir().unwrap();
    let zip_path = dir.path().join("splitme.zip");

    // 创建多个小文件，确保每个文件都小于分卷大小
    let mut file_paths = vec![];
    for i in 0..5 {
        let file_path = dir.path().join(format!("file{}.txt", i));
        let mut file = File::create(&file_path).unwrap();
        // 用随机内容填充每个文件 100KB
        let mut buf = vec![0u8; 100 * 1024];
        // 使用固定种子保证测试可复现
        let mut rng = StdRng::seed_from_u64(i);
        rng.fill_bytes(&mut buf);
        file.write_all(&buf).unwrap();
        file_paths.push(file_path);
    }

    // 创建zip
    let mut cmd = Command::new("./target/debug/utzip");
    cmd.arg(&zip_path);
    for file_path in &file_paths {
        cmd.arg(file_path);
    }
    let status = cmd.status().unwrap();
    assert!(status.success());

    // 获取压缩后zip的总大小
    let zip_meta = metadata(&zip_path).unwrap();
    let zip_size = zip_meta.len();

    // 设置分卷大小为压缩后总大小的一半，且大于单个条目压缩后大小
    // 这里假设压缩率不高，单个条目压缩后不会超过150KB
    let split_size = (zip_size / 2).max(150 * 1024);

    // 分卷
    let status = Command::new("./target/debug/utzipsplit")
        .arg(&zip_path)
        .arg("-n")
        .arg(format!("{}", split_size))
        .arg("-b")
        .arg(dir.path())
        .status()
        .unwrap();
    assert!(status.success());

    // 检查分卷文件存在
    // 可选：判断至少有两个分卷
    let parts: Vec<_> = (1..=5)
        .map(|i| dir.path().join(format!("splitme{}.zip", i)))
        .filter(|p| p.exists())
        .collect();
    assert!(parts.len() >= 2);
}
